from flask import g
from flask import session,render_template,current_app,jsonify,request

from info import db
from info.utils.response_code import RET
from info.models import User,News,Category
from . import news_blue
from info.utils.commons import login_required

#项目首页
@news_blue.route('/')
@login_required
def index():
    #从装饰其中获取用户信息
    user=g.user
    #新闻点击排行
    try:
        news_list=News.query.order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻数据异常')

    if not news_list:
        return jsonify(errno=RET.NODATA, errmsg='新闻数据不存在在')

    #遍历查询结果
    new_dict_list=[]
    for news in news_list:
        new_dict_list.append(news.to_dict())


    #首页新闻分类数据
    try:
        categories=Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻分类数据异常')

    if not categories:
        return jsonify(errno=RET.NODATA, errmsg='无新闻分类数据')


    #定义容器，查询遍历结果
    category_list=[]
    for category in categories:
        category_list.append(category.to_dict())



    data = {
            'user_info': user.to_dict() if user else None,
            'new_dict_list':new_dict_list,
            'category_list':category_list
            }
    return render_template('news/index.html',data=data)

@news_blue.route('/news_list')
def get_news_list():

    """
       首页新闻列表数据加载
       1、获取参数，cid/page/per_page
       2、因为cid/page和per_page不是必传参数，需要给默认值
       3、检查参数，转换成int类型
       4、判断新闻分类cid是否大于1
       5、查询条件默认安装新闻的发布时间排序，对排序数据进行分页
       6、获取分页后的新闻数据
       7、遍历分页后的新闻数据，调用模型类中的方法，把数据转成可读字符串
       8、返回结果
       data  = {
           'news_dict_list':news_dict_list,
           'total_page':total_page,
           'current_page':current_page
       }

       :return:
       """
    cid=request.args.get('cid','1')
    page=request.args.get('page','1')
    per_page=request.args.get('per_page','10')

    #校检参数
    try:
        cid,page,per_page = int(cid),int(page),int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数格式错误')

    #定义过滤条件
    filters=[]
    if cid>1:
        filters.append(News.category_id==cid)

    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,per_page,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询分页数据失败')


    #获取分页后的数据，总页数，当前页数
    news_list=paginate.items
    total_page=paginate.pages
    current_page=paginate.page

    news_dict_list=[]
    for news in news_list:
        news_dict_list.append(news.to_dict())

    data={
        'news_dict_list':news_dict_list,
        'total_page':total_page,
        'current_page':current_page
    }
    return jsonify(errno=RET.OK,errmsg='OK',data=data)

@news_blue.route('/<int:news_id>')
@login_required
def get_news_detail(news_id):
    """
       新闻详情
       1、判断用户是否登录
       2、根据news_id查询数据
       3、判断查询结果是否存在
       4、让新闻的点击次数加1
       5、提交数据
       6、返回结果

       :return:
       """
    user=g.user
    # if not user:
    #     return jsonify(errno=RET.SESSIONERR, errmsg='用户未登录')

    try:
        news=News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据异常')
    if not news:
        return jsonify(errno=RET.NODATA, errmsg='无新闻详情数据')
    news.clicks+=1

    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')

    try:
        news_list=News.query.order_by(News.clicks.desc()).limit(6)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询新闻数据异常')
    # 判断查询结果是否存在
    if not news_list:
        return jsonify(errno=RET.NODATA, errmsg='新闻数据不存在')

    news_dict_list=[]
    for index in news_list:
        news_dict_list.append(index.to_dict())



    data = {
        'user_info':user.to_dict() if user else None,
        'news_detail':news.to_dict(),
        'news_dict_list':news_dict_list
    }


    return render_template('news/detail.html',data=data)


#收藏新闻
@news_blue.route('/news_collect',methods=['POST'])
@login_required
def news_collect():
    """
    收藏新闻
    1、尝试获取用户信息
    2、如果未登录，直接终止程序
    3、获取参数，news_id,action
    4、把news_id转成int类型
    5、检查action必须是收藏或取消收藏
    6、根据news_id查询数据库，
    7、判断查询结果，确认新闻的存在
    8、判断用户选择的是收藏，添加数据
    9、如果是取消收藏，删除数据
    10、返回结果

    :return:
    """
    user=g.user
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg='用户未登录')

    # 获取参数
    news_id = request.json.get('news_id')
    action = request.json.get("action")

    try:
        news_id = int(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数格式错误')

    # 检查action必须为收藏或取消收藏
    if action not in ['collect', 'cancel_collect']:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')

    try:
        news=News.query.get(news_id)

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据失败')

    # 判断查询结果
    if not news:
        return jsonify(errno=RET.NODATA, errmsg='新闻数据不存在')

    if action=='collect':
        if news not in user.collection_news:
            user.collection_news.append(news)

    else:
        user.collection_news.remove(news)

    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存数据失败')

    return jsonify(errno=RET.OK,errmsg='OK')



#项目logo的展示
@news_blue.route('/favicon.ico')
def favicon():
    #使用应用上下文，调用flask源码中的发送静态文件给浏览器的方法，实现logo的展示
    return current_app.send_static_file('news/favicon.ico')





